S3 Object Expiration 설정법

Q. S3 오브젝트의 수명주기를 태그 속성에 따라서 Expiration Days 값을 설정하는 방법에 대해서 설명해주세요.

제 유스케이스는 S3 오브젝트의 수명주기가 맞을 것 같아요. 아래 태그 속성에 따라서 Expiration Days 값을 아래와 같이 설정하고 싶어요.

{
  "Rules": [
    {
      "ID": "DeleteTaggedPremium",
      "Status": "Enabled",
      "Filter": {
        "Tag": {
          "Key": "isPremium",
          "Value": "false"
        }
      },
      "Expiration": {
        "Days": 30
      }
    }
  ]
}

A. ChatGPT4o

네, 정확하게 방향 잘 잡으셨어요! 말씀하신 유즈케이스는 S3 Lifecycle Rule + Tag 기반 조건 삭제에 딱 맞습니다. 지금 설정하신 Rule은 isPremium=false 태그가 붙은 오브젝트에 대해 30일 후 자동 삭제되도록 설정하는 것이고, 완벽하게 작동합니다. 다만 몇 가지 주의사항과 확장 아이디어를 추가로 드릴게요.


✅ 정리: 사용하고자 하는 설정

🔖 태그 기준으로 S3 오브젝트 만료 설정

{
  "Rules": [
    {
      "ID": "DeleteTaggedPremium",
      "Status": "Enabled",
      "Filter": {
        "Tag": {
          "Key": "isPremium",
          "Value": "false"
        }
      },
      "Expiration": {
        "Days": 30
      }
    }
  ]
}

의미:


📦 파일 업로드 시 Tag 적용 방법

▶️ AWS SDK (Node.js 예시)

import { PutObjectCommand } from '@aws-sdk/client-s3';

await s3Client.send(new PutObjectCommand({
  Bucket: 'your-bucket',
  Key: 'uploads/example.txt',
  Body: yourFileStream,
  Tagging: 'isPremium=false',
}));

Tagging 필드는 key=value 형식으로 전달됩니다. 여러 태그는 &로 구분 (foo=bar&baz=qux).

▶️ Presigned URL 사용 시

Presigned URL에도 Tagging 파라미터를 명시해주어야 합니다.

import { PutObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

const command = new PutObjectCommand({
  Bucket: 'your-bucket',
  Key: 'uploads/example.txt',
  Tagging: 'isPremium=false'
});

const url = await getSignedUrl(s3Client, command, { expiresIn: 300 });

클라이언트는 이 URL을 사용해서 PUT 요청을 보내면 Tag가 자동 적용됩니다.


🚨 주의사항

1. Lifecycle Rule이 적용되기까지 지연 시간 존재

2. Tagging이 적용되지 않으면 Rule은 작동 안 함

3. 다른 Tag Value 또는 Tag Key를 추가해 확장 가능

예:


📌 확장 예시: deleteAfter=7 같은 Tag 값으로 유연한 수명 설정

Rule 1: deleteAfter=7 → 7일 후 삭제

{
  "ID": "DeleteAfter7",
  "Status": "Enabled",
  "Filter": {
    "Tag": {
      "Key": "deleteAfter",
      "Value": "7"
    }
  },
  "Expiration": {
    "Days": 7
  }
}

이런 식으로 다양한 수명 정책을 tag로 분기 처리할 수 있어요.